import axios from 'axios'
import { useToast } from 'vue-toastification'

axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL

const toast = useToast()

axios.interceptors.request.use(
  (config) => {
    return config
  },
  (error) => {
    toast.error('请求错误')
    return Promise.reject(error)
  },
)

axios.interceptors.response.use(
  (response) => {
    if (response.data.code !== 0) {
      toast.error(`请求失败: ${response.data.msg}`)
      return Promise.reject(response.data)
    }
    return response
  },
  (error) => {
    if (error.response) {
      toast.error(`响应错误: ${error.response.data.msg || error.message}`)
    } else {
      toast.error(`请求失败: ${error.message}`)
    }
    return Promise.reject(error)
  },
)

type TResponse<T> = {
  code: number
  msg: string
  msg_jp: string
  data: T
}

export type TGetActivityData = {
  id: number
  name: string
  date: string
  /**
   * 活动状态 1: 未开始 2: 进行中 3: 已结束
   */
  status: number
  /**
   * 签到总人数
   */
  signnum: number
  /**
   * 已中奖人数
   */
  awardnum: number
  /**
   * 奖项列表
   */
  prize: {
    prize_id: number
    prize_level: string
    prize_name: string
    prize_image: string
    prize_quantity: number
    prize_left: number
  }[]
  images: {
    activity: string
    opening: string
    closing: string
  }
  music: string
  seating_plan: string
}

/**
 * 获取活动配置
 * @description 获取指定活动的详细信息，包括签到人数、奖项列表等。
 */
export function getActivity() {
  return axios.get<TResponse<TGetActivityData>>('/activity', {
    params: {
      actid: 1,
    },
  })
}

export type TGetPrizeData = {
  prize_id: number
  prize_level: string
  prize_name: string
  /**
   * 奖项总数量
   */
  prize_quantity: number
  /**
   * 剩余数量
   */
  prize_left: number
  /**
   * 已中奖人数
   */
  awardnum: number
  /**
   * 未中奖人数
   */
  unawardnum: number
}

/**
 * 获取奖项参数
 * @description 获取指定奖项的详细信息，包括剩余数量、已中奖人数和未中奖人数。
 * @param {number} prize_id 奖项ID
 */
export function getPrize(prize_id: number) {
  return axios.post<TResponse<TGetPrizeData>>('/prize', {
    prize_id,
  })
}

export type TStartLotteryData = {
  prize_id: number
  awardnum: number
  unawardnum: number
  awardlist: {
    id: number
    name: string
    /**
     * 奖券号码
     */
    number: string
  }[]
}

/**
 * 执行抽奖
 * @description 执行抽奖操作，随机抽取指定数量的未中奖者。
 * @param prize_id 奖项ID
 * @param num 抽奖人数，默认为1
 */
export function startLottery(prize_id: number, num: number = 1) {
  return axios.post<TResponse<TStartLotteryData>>('/startlottery', {
    prize_id,
    num,
  })
}

export type TGetAwardListData = Record<
  string,
  {
    number: string
    company_name: string
    sign_name: string
    award_time: string
  }[]
>

/**
 * 获取中奖列表
 * @description 获取活动的所有中奖记录，按奖项分组。
 */
export function getAwardList() {
  return axios.get<TResponse<TGetAwardListData>>('/awardlist', {
    params: {
      actid: 1,
    },
  })
}

/**
 * 测试接口 - 清除中奖记录
 * @description 清除所有中奖记录，用于测试。
 */
export function clearAwardRecords() {
  return axios.get<TResponse<{ message: string }>>('/test', {
    params: {
      actid: 1,
    },
  })
}
